package io;

import java.io.Serializable;
import java.util.Arrays;

/*使用当前类测试对象的序列化和反序列化
*
* JAVA BEAN定义规范
* 1.属性私有化
* 2.为属性提供公开的GET SET方法
* 3.定义无参构造器
* 4.实现序列化接口
* 凡是需要进行序列化的类都必须实现Serializable接口*/
public class Person implements Serializable {
    public static final long serialVersionUID = 1L;//版本号,程序员便于维护
    /*引用类型的属性需要实现序列化接口
        在序列化对象时,会依靠当前类结构计算一个版本号,保存到文件中.
    * 序列化的版本号,会影响反序列化是否成功
    * 随着类的升级改动,结构发生变化,对象和序列化的对象结构不一致,序列化的版本号:
    *   如果序列号不变,采用兼容模式,会尽可能地还原原对象(将还存在的属性还原)
    *   如果序列号改变了,对象无法还原(java.io.InvalidClassException ,原版本号为:6369720078899105124l,本地版本号为:1 程序报错,认为对象废弃)*/
    private String name;
    private int age;
    private String gender;
    private String[] otherInfo;
    /*transient 短暂的
    * 在序列化时,会忽略该属性;在反序列化时,没有值
    * 对象瘦身:仅保存必须的属性*/
    private transient double salary;

    public Person(){}

    public Person(String name, int age, String gender, String[] otherInfo,double salary) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.otherInfo = otherInfo;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String[] getOtherInfo() {
        return otherInfo;
    }

    public void setOtherInfo(String[] otherInfo) {
        this.otherInfo = otherInfo;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", otherInfo=" + Arrays.toString(otherInfo) +
                ", salary=" + salary +
                '}';
    }
}
